package Solution221_240;

import java.util.Stack;

public class Solution227 {

    public int calculate2(String s) {
        char sign = '+';// 保存上一个符号，初始为 +
        Stack<Integer> numStack = new Stack<>();
        int num = 0; // 保存当前数字，如：12是两个字符，需要进位累加
        int result = 0;
        for (int i = 0; i < s.length(); i++) {
            char cur = s.charAt(i);
            if (cur >= '0') {
                num = num * 10 - '0' + cur;// 记录当前数字。先减，防溢出
            }
            if ((cur < '0' && cur != ' ') || i == s.length() - 1) {
                switch (sign) {  // 判断上一个符号是什么
                    // 当前符号前的数字直接压栈
                    case '+':
                        numStack.push(num);
                        break;
                    // 当前符号前的数字取反压栈
                    case '-':
                        numStack.push(-num);
                        break;
                    // 数字栈栈顶数字出栈，与当前符号前的数字相乘，结果值压栈
                    case '*':
                        numStack.push(numStack.pop() * num);
                        break;
                    // 数字栈栈顶数字出栈，除于当前符号前的数字，结果值压栈
                    case '/':
                        numStack.push(numStack.pop() / num);
                        break;
                }
                sign = cur; // 记录当前符号
                num = 0; // 数字清零

            }
        }
        while (!numStack.isEmpty()) { // 将栈内剩余数字累加，即为结果
            result += numStack.pop();
        }
        return result;
    }


    public int calculate(String s) {
        char sign = '+'; //保存上一个符号，初始为+
        Stack<Integer> numStack = new Stack<>();//存储最后需要相加的数字
        int num = 0;//保存当前数字，两位数需要进位计算
        int result = 0;
        for (int i = 0; i < s.length(); i++) {
            char cur = s.charAt(i);
            //因为标点符号的编码都在'0'前面
            if (cur >= '0') {
                // 先减 以免溢出
                num = num * 10 - '0' + cur;
            }
            //运算，空格，最后一位
            if ((cur < '0' && cur != ' ') || i == s.length() - 1) {
                switch (sign) {
                    case '+':
                        numStack.push(num);
                        break;
                    case '-':
                        numStack.push(-num);
                        break;
                    case '*':
                        numStack.push(numStack.pop() * num);
                        break;
                    case '/':
                        numStack.push(numStack.pop() / num);
                        break;
                }
                sign = cur;
                num = 0;
            }
        }
        while (!numStack.isEmpty()) {
            result += numStack.pop();
        }
        return result;
    }
}
